package com.ruoyi.web.controller.yf;

import com.github.pagehelper.PageInfo;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.util.ShiroUtils;


import com.ruoyi.system.domain.SysDept;
import com.ruoyi.system.domain.SysDictData;
import com.ruoyi.system.domain.SysDistricts;
import com.ruoyi.system.domain.SysRole;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.yf.domain.YfHospitalStatus;
import com.ruoyi.yf.domain.YfStorageWarning;
import com.ruoyi.yf.service.IYfStorageWarningService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 院内医废预警量配置Controller
 * 
 * @author XiaoYi...
 * @date 2020-06-02
 * e8d31583-5df9-409f-82e2-bcdd29731c94
 */
@Controller
@RequestMapping("/yf/warning")
public class YfStorageWarningController extends BaseController
{
    private String prefix = "yf/warning";

    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    @Autowired
    private IYfStorageWarningService yfStorageWarningService;
    @Autowired
    private ISysDictDataService sysDictDataService;
    @Autowired
    private ISysDeptService sysDeptService;


    /**
     * 新增院内医废预警量配置
     * b3222efc-268a-4db0-a49d-df0e90560567
     */
    @GetMapping("/add")
    public String add()
    {
        return prefix + "/add";
    }


    // 跳转到院内医废预警量设置页面
//    6a889efc-d83b-46f3-b4ce-1ff4c4b4067d
//    @RequiresPermissions("yf:warning:view")
    @GetMapping()
    public String warning() {
        return prefix + "/warning";
    }

    // 跳转到院内医废预警量设置页面
//    32742b0a-aa54-4ba1-8dd5-06ef3df078cc
//    @RequiresPermissions("yf:warning:view")
    @GetMapping("/overduenotinputList")
    public String overduenotinputList() {
        return prefix + "/overduenotinput_list";
    }

    // 跳转到异常记录报警页面

//    @RequiresPermissions("yf:warning:view")
//    abaa6920-c977-4d46-8151-bb97a1068e16
    @GetMapping("/hospitalWarn")
    public String hospitalWarn() {
        return prefix + "/hospital_warn";
    }
//796a9c8a-0b08-4538-9d80-fddde8e9e1b0
    // 跳转到辖区异常记录报警页面
    @GetMapping("/districtsWarn")
    public String districtsWarn(ModelMap mmap) {
        Integer districtsId = ShiroUtils.getSysUser().getDept().getDistrictsId();
        String deptType = ShiroUtils.getSysUser().getDept().getDeptType();
        mmap.put("deptType", deptType);
        mmap.put("districtsId", districtsId);
        return prefix + "/districts_warn";
    }

    // 跳转到医院暂存点页面
    //91093c19-fc7e-415f-a692-201c51d2f131
//    @RequiresPermissions("yf:warning:view")
    @GetMapping("/hospitalStatus")
    public String hospitalStatus() {
        return prefix + "/hospital_status";
    }


    /**
     * 查询院内医废预警量配置列表
     * 9b5107b7-2752-435b-abf5-2998b84b57da
     */
//    @RequiresPermissions("yf:warning:list")
    @PostMapping("/list")
    @ResponseBody
    public TableDataInfo list(YfStorageWarning yfStorageWarning){
        if(yfStorageWarning == null || yfStorageWarning.getHospitalId() == 100L ){
            return getDataTable(new ArrayList<>());
        }
//        startPage();
//        List<YfStorageWarning> list = yfStorageWarningService.selectYfStorageWarningList(yfStorageWarning);
        List<YfStorageWarning> list = yfStorageWarningService.selectYfTypeStorageWarningList(yfStorageWarning);
        if( !(list.get(list.size()-1).getYfTypeValue()).equals("maxstore") ){
            YfStorageWarning warn = new YfStorageWarning();
            warn.setYfTypeValue("maxstore");
            warn.setYfTypeLabel("预警总值");
            list.add(warn);
        }
        for (int i = 0; i < list.size() ; i++) {
            if( list.get(i).getHospitalId() == null ||  list.get(i).getHospitalId() == 0 ){
                list.get(i).setHospitalId( yfStorageWarning.getHospitalId() );
            }
        }
        return getDataTable(list);
    }

    /**
     * 根据医院id查询医院暂存点
     * 9ebef14d-99b5-4136-84a1-849eeee7acf6
     */
    @PostMapping("/getStangsByHospitalId")
    @ResponseBody
    public TableDataInfo list(Long hospitalId) {
        startPage();
        List<SysDept> list = yfStorageWarningService.getStangsByHospitalId(hospitalId);
        return getDataTable(list);
    }


    /**
     * 查询登录用户所在机构的地区的下辖区县
     */
    @PostMapping("/getCountyByDistrictsId")
    @ResponseBody
    public TableDataInfo getCountyByDistrictsId() {
        // 获取当前登录用户所在的机构的地区   平台 0   省  13 两位  市 1301 4位   区县 6位
        Integer districtsId = ShiroUtils.getSysUser().getDept().getDistrictsId();
        if( districtsId == null || (districtsId + "").length() > 4 ){
            return getDataTable(new ArrayList<>());
        }
        String flag = "2";      //  1时  admin登录 查询所有区县limit限制   2时 省市登录
        if( (districtsId + "").length() == 1 ){
            flag = "1";
        }

        System.out.println("    ----- 地区：" + districtsId );

        List<SysDistricts> list = yfStorageWarningService.getCountyByDistrictsId(flag, districtsId);
        return getDataTable(list);
    }





    /**
     * 获取医院
     * ba53f62c-bfc7-4f49-928b-cc5a5948dacd
     */
    @PostMapping("/getHospital")
    @ResponseBody
    public TableDataInfo getHospital() {
        // 用户所在的机构id
        Long deptId = ShiroUtils.getSysUser().getDeptId();
        startPage();
        List<SysDept> list = yfStorageWarningService.getHospital(deptId);
        return getDataTable(list);
    }

    /**
     * 院内超期未录入配置列表
     * 740c007b-6057-42f8-9c73-4f242ed0d156
     */
    @PostMapping("/hospitalOverdueNotinputList")
    @ResponseBody
    public TableDataInfo hospitalOverdueNotinputList(YfHospitalStatus yfHospitalStatus) {
        // 用户所在的机构id
        Long deptId = ShiroUtils.getSysUser().getDeptId();
        // 用户所在机构类型
        SysDept dept = sysDeptService.selectDeptById( deptId );
        String deptType = dept.getDeptType();
        // 查询标识： 0  卫健委及以上     1  医院
        String selectType = "0";
        // 省级医院、市级医院、区县级医院、乡镇卫生院、社区，只查询当前机构   310 社区   320  乡镇卫生院
        if( deptType.equals("220") || deptType.equals("270")  || deptType.equals("290")
                || deptType.equals("310") || deptType.equals("320") ){
            yfHospitalStatus.setHospitalId(dept.getDeptId());
            selectType = "1";
        }
        startPage();
        List<YfHospitalStatus> list = yfStorageWarningService.hospitalOverdueNotinputList(deptId, selectType, yfHospitalStatus);
        return getDataTable(list);
    }


    /**
     * 修改院内超期未录入配置列表
     * 277a0723-3824-4dd2-97ff-5f1bdf218040
     */
    @GetMapping("/hospitalOverdueEdit/{stagingId}")
    public String hospitalOverdueEdit(@PathVariable("stagingId") Long stagingId, ModelMap mmap) {
        SysDept dept = sysDeptService.selectDeptById(stagingId);
        mmap.put("sysDept", dept);
        return prefix + "/overduenotinput_edit";
    }


    /**
     * 预警开关修改
     * 0d59efd6-d525-4c9b-b0f8-2012dc5ee834
     */
    @Log(title = "预警开关", businessType = BusinessType.UPDATE)
    @RequiresPermissions("yf:warning:overdueinputedit")
    @PostMapping("/changeOverdueNotinputSwitchStatus")
    @ResponseBody
    public AjaxResult changeOverdueNotinputSwitchStatus(Long stagingId,String status) {
        return toAjax(yfStorageWarningService.changeOverdueNotinputSwitchStatus(stagingId, status));
    }


    /**
     * 修改超期未录入预警
     * 8aa5259f-5e21-43d6-8c8d-4c5ba70dfe59
     */
    @Log(title = "修改超期未录入预警", businessType = BusinessType.UPDATE)
    @PostMapping("/updateOverdueNotinput")
    @ResponseBody
    public AjaxResult updateOverdueNotinput(SysDept sysDept) {
        return toAjax(yfStorageWarningService.updateOverdueNotinput(sysDept));
    }


    /**
     * 辖区异常记录报警查询
     * 152a7e26-fa53-4f27-9897-656f99096bbc
     */
    @PostMapping("/districtsWarnStatusList")
    @ResponseBody
    public TableDataInfo districtsWarnStatusList(Long disId) throws ParseException  {

        List<YfHospitalStatus> list = null;
        if ((disId + "").length() == 6) {
            // 区县级卫健局 -- 显示区县级卫健局下辖医院预警状况（统计到暂存点） -- 废弃
            // list = yfStorageWarningService.districtsHospitalWarnStatusList(disId);

            // 先取机构管理中的医疗机构统计到暂存点（只取科室类型为10的医废），按医院分组后，再合并科室不是10的医疗机构
            list = yfStorageWarningService.districtsCountyHospitalInDeptWarnStatusList(disId);

        } else {  // 市卫健委及以上，辖区内各医院暂存点状况
            // 地区 -- 各地区机构总数 -- 左连医院 -- 医院总科室数  --  左连暂存点  -- 左连医废（不区分科室类型） -- 废弃
            // list = yfStorageWarningService.districtsWarnStatusList(disId);

            // 地区 -- 左连医院 -- 左连暂存点  -- 左连医废（只取科室类型为10的医废）（不取各地区机构总数、各医院总科室数）
            // 先取机构管理中的医疗机构统计到暂存点（只取科室类型为10的医废），按医院分组后，再合并科室不是10的医疗机构
            list = yfStorageWarningService.districtsCityHospitalInDeptWarnStatusList(disId);
        }


        if( list == null || list.isEmpty() ){
            return getDataTable(list);
        }

        // 遍历：set各暂存点预警的状态    0 不预警    1 预警
        list = setWarn( list );

        System.out.println("    -----  数据库查询出来的list长度： " + list.size() );


        // 区县级卫健局 -- 显示区县级卫健局下辖医院预警状况
        if ((disId + "").length() == 6) {

            // 分组，先把暂存点合并成医院
            List<YfHospitalStatus> hoslist = groupingStagingToHospital( list );

            // 添加科室中的医疗机构（统计科室，无需合并暂存点）
            List<YfHospitalStatus> deptinkslist = yfStorageWarningService.districtsCountyHospitalInKSWarnStatusList(disId);
            // 遍历：set各暂存点预警的状态    0 不预警    1 预警
            deptinkslist = setWarn( deptinkslist );
            hoslist.addAll(deptinkslist);

            // 排序 -- 预警次数从大到小
            List<YfHospitalStatus> sortlist =
                    hoslist.stream().sorted(Comparator.comparing(YfHospitalStatus::getWarnNum).reversed()).collect(Collectors.toList());

            return getDataTable(sortlist);


//            // 假分页
//            // 修改后 -- backlist 分段取出   第一次 默认   页数： 1      每页条数：10
//            PageDomain pageDomain = TableSupport.buildPageRequest();
//            Integer pageNum = pageDomain.getPageNum();
//            Integer pageSize = pageDomain.getPageSize();
//
//            // System.out.println( "  ----------------------- 页数：" + pageNum + "    每页条数：" +  pageSize  );

//            // 最终返回的分页的list
//            List<YfHospitalStatus> zlist;
//
//            int startIndex = (pageNum - 1) * pageSize;
//            int endIndex = startIndex + pageSize;
//            // 如果起始位超过 backlist 的长度，返回空list
//            if( startIndex > (sortlist.size() - 1) ){
//                zlist = new ArrayList<>();
//            }else{
//                zlist = sortlist.subList(startIndex,endIndex > sortlist.size()? sortlist.size():endIndex );
//            }
//
//            TableDataInfo rspData = new TableDataInfo();
//            rspData.setCode(0);
//            rspData.setRows(zlist);
//            rspData.setTotal(new PageInfo(sortlist).getTotal());
//
//            return rspData;

        } else {  // 市卫健委及以上，辖区内各医院暂存点状况

            // 没有医院的地区数量
            List<YfHospitalStatus> nohosdqlist = list.stream().filter( s -> s.getHospitalId() == null).collect(Collectors.toList());
            for (int i = 0; i <nohosdqlist.size(); i++) {
                nohosdqlist.get(i).setDistrictDeptNum(0);   // 没有医疗机构的地区，医疗机构数量设置为0
            }
            System.out.println("    -----  没有医院的地区数量： " + nohosdqlist.size() );

            // 分组，先把暂存点合并成医院
            List<YfHospitalStatus> hoslist = groupingStagingToHospital( list );

            // 添加没有医院的地区
            hoslist.addAll(nohosdqlist);

            // 添加科室中的医疗机构（统计科室，无需合并暂存点）
            List<YfHospitalStatus> deptinkslist = yfStorageWarningService.districtsCityHospitalInKSWarnStatusList(disId);
            // 遍历：set各暂存点预警的状态    0 不预警    1 预警
            deptinkslist = setWarn( deptinkslist );
            hoslist.addAll(deptinkslist);

            System.out.println("    -----  按医院分组后list长度： " + hoslist.size() );

            // 分组，把医院合并成地区
            // 合并后需要的字段：地区id、地区名称、地区的机构数量（机构+科室中机构）、四种报警大于1的医院科室中机构数相加
            List<YfHospitalStatus> dqlist = new ArrayList<>();
            hoslist.stream()
                    .collect(Collectors.groupingBy(YfHospitalStatus::getDistrictId))
                    .forEach((k,v) -> {
                        Optional<YfHospitalStatus> dq = v.stream().reduce((v1, v2) -> {  // 合并
                            v1.setDistrictDeptNum( v1.getDistrictDeptNum() + v2.getDistrictDeptNum() );
                            v1.setIsHospitalWarn( v1.getIsHospitalWarn() + v2.getIsHospitalWarn() );
                            v1.setIsOverdueMaxStoreWarn( v1.getIsOverdueMaxStoreWarn() + v2.getIsOverdueMaxStoreWarn() );
                            v1.setIsOverdueNoInputWarn( v1.getIsOverdueNoInputWarn() + v2.getIsOverdueNoInputWarn() );
                            v1.setIsOverdueNoInYFWarn( v1.getIsOverdueNoInYFWarn() + v2.getIsOverdueNoInYFWarn() );
                            v1.setIsOverdueNoOutYFWarn( v1.getIsOverdueNoOutYFWarn() + v2.getIsOverdueNoOutYFWarn() );
                            return v1;
                        });
                        dqlist.add( dq.orElse( new YfHospitalStatus() ) );
                    });

            System.out.println("    -----  按地区分组后list长度： " + dqlist.size() );

            // 按异常机构数量从大到小排序
            List<YfHospitalStatus> sortdqlist =
                    dqlist.stream().sorted(Comparator.comparing(YfHospitalStatus::getIsHospitalWarn).reversed()).collect(Collectors.toList());

            System.out.println("    -----  排序后list长度： " + sortdqlist.size() );

            return getDataTable(sortdqlist);

        }


    }


    // 遍历：set各暂存点预警的状态    0 不预警    1 预警
    //3b2d589f-7f5f-437a-909b-55c48ad06eed
    private List<YfHospitalStatus> setWarn(List<YfHospitalStatus> list) throws ParseException {
        for (int i = 0; i < list.size(); i++) {
            // 每个医疗机构的初始数量为1，用于按地区合并时
            list.get(i).setDistrictDeptNum( 1 );

            // 取预警值、暂存量
            if( list.get(i).getMaxStore() != null && list.get(i).getMaxStore() != 0
                    && list.get(i).getInStoreWeight() != null && list.get(i).getInStoreWeight() != 0 ){     // 无预警值、无暂存量 则不需要预警
                if( list.get(i).getInStoreWeight() > list.get(i).getMaxStore() ){   // 暂存量超过预警值预警
                    list.get(i).setIsOverdueMaxStoreWarn(1);
                    list.get(i).setIsHospitalWarn(1);
                    list.get(i).setWarnNum( list.get(i).getWarnNum() + 1 );
                }
            }
            // 从最后一次收集时间算起（最后一次收集时间、暂存点创建时间、今日无医废点击时间 -- 取最大值）,超过24小时或设置的小时无医废录入预警
            if( !StringUtils.isEmpty(list.get(i).getOverdueNotinputSwitch()) && list.get(i).getOverdueNotinputHours() != null
                    && list.get(i).getOverdueNotinputSwitch().equals("0") ){   // 0 开启预警
                long overdueTime = 3600000L * (list.get(i).getOverdueNotinputHours() + 24);
                if( list.get(i).getLastCollMaxDate() != null ){    // 有最后一次收集时间才比较，没有不预警
                    // 处理最后一次收集时间取到天转成long型
                    String lastCollMaxDate = sdf.format(list.get(i).getLastCollMaxDate());
                    if( (new Date().getTime() - sdf.parse(lastCollMaxDate).getTime()) > overdueTime ){ // 最后一次收集时间超过设置的预警时间
                        list.get(i).setIsOverdueNoInputWarn(1);
                        list.get(i).setIsHospitalWarn(1);
                        list.get(i).setWarnNum( list.get(i).getWarnNum() + 1 );
                    }
                }
            }
            // 已收集医废24小时未入库
            if( !StringUtils.isEmpty( list.get(i).getOverdueNoInYFTotal() ) ){
                list.get(i).setIsOverdueNoInYFWarn(1);
                list.get(i).setIsHospitalWarn(1);
                list.get(i).setWarnNum( list.get(i).getWarnNum() + 1 );
            }
            // 已入库医废超过48小时未出库
            if( !StringUtils.isEmpty( list.get(i).getOverdueNoOutYFTotal() ) ){
                list.get(i).setIsOverdueNoOutYFWarn(1);
                list.get(i).setIsHospitalWarn(1);
                list.get(i).setWarnNum( list.get(i).getWarnNum() + 1 );
            }
        }

        return list;
    }


    // 分组，把暂存点合并成医院
    //64e9fff0-131f-4fe9-a634-4648fce708ef
    private List<YfHospitalStatus> groupingStagingToHospital(List<YfHospitalStatus> list){
        // 合并后需要的字段：地区id、地区名称、地区的机构数量（机构+科室中机构）、医院id、科室的机构数、四种报警按医院暂存点取较大值
        // Stream.generate(Math::random).limit(10).forEach(System.out::print);
        List<YfHospitalStatus> hoslist = new ArrayList<>();
        list.stream()
                .filter(s -> s.getHospitalId() != null)
                .collect(Collectors.groupingBy(YfHospitalStatus::getHospitalId))        // getHospitalId 如果为空 报错
                .forEach((k,v) -> {
                    Optional<YfHospitalStatus> hospital = v.stream().reduce((v1, v2) -> {  // 合并
                        v1.setIsHospitalWarn( v1.getIsHospitalWarn() >= v2.getIsHospitalWarn() ?
                                v1.getIsHospitalWarn() : v2.getIsHospitalWarn()  );
                        v1.setIsOverdueMaxStoreWarn( v1.getIsOverdueMaxStoreWarn() >= v2.getIsOverdueMaxStoreWarn() ?
                                v1.getIsOverdueMaxStoreWarn() : v2.getIsOverdueMaxStoreWarn() );
                        v1.setIsOverdueNoInputWarn( v1.getIsOverdueNoInputWarn() >= v2.getIsOverdueNoInputWarn() ?
                                v1.getIsOverdueNoInputWarn() : v2.getIsOverdueNoInputWarn() );
                        v1.setIsOverdueNoInYFWarn( v1.getIsOverdueNoInYFWarn() >= v2.getIsOverdueNoInYFWarn() ?
                                v1.getIsOverdueNoInYFWarn() : v2.getIsOverdueNoInYFWarn() );
                        v1.setIsOverdueNoOutYFWarn( v1.getIsOverdueNoOutYFWarn() >= v2.getIsOverdueNoOutYFWarn() ?
                                v1.getIsOverdueNoOutYFWarn() : v2.getIsOverdueNoOutYFWarn() );
                        return v1;
                    });
                    hoslist.add( hospital.orElse( new YfHospitalStatus() ) );
                });
        return hoslist;
    }


    /**
     * 医院暂存点状况
     * e6f92d17-4329-4ba9-958a-63e08ca13e38
     */
    @PostMapping("/hospitalStatusList")
    @ResponseBody
    public TableDataInfo hospitalStatusList(YfHospitalStatus yfHospitalStatus) {
        // 用户所在的机构id
        Long deptId = ShiroUtils.getSysUser().getDeptId();
        // 用户所在机构的类型
        String deptType = sysDeptService.selectDeptById( deptId ).getDeptType();
        startPage();
        List<YfHospitalStatus> list;
        if( deptType.equals("220") || deptType.equals("270")  || deptType.equals("290")
                || deptType.equals("310") || deptType.equals("320") ){       // 省级医院、市级医院、区县级医院、乡镇卫生院、社区
            list = yfStorageWarningService.hospitalStatus(deptId);
        }else{
            list = yfStorageWarningService.hospitalStatusList(deptId, yfHospitalStatus);
        }
        return getDataTable(list);
    }


    /**
     * dbe79ad3-bf6a-4afb-aea6-48703d11e38f
     * 异常记录报警
     */
    @PostMapping("/hospitalWranList")
    @ResponseBody
    public TableDataInfo hospitalWranList(YfHospitalStatus yfHospitalStatus) throws ParseException {
        // 用户所在的机构id
        Long deptId = ShiroUtils.getSysUser().getDeptId();
        // 用户所在机构的类型
        String deptType = sysDeptService.selectDeptById( deptId ).getDeptType();
//         startPage();
        List<YfHospitalStatus> list;
        if( deptType.equals("220") || deptType.equals("270")  || deptType.equals("290")
                || deptType.equals("310") || deptType.equals("320") ){       // 省级医院、市级医院、区县级医院、乡镇卫生院、社区
            list = yfStorageWarningService.hospitalStatus(deptId);
        }else{
            list = yfStorageWarningService.hospitalStatusList(deptId, yfHospitalStatus);
        }

        if( list == null || list.isEmpty() ){
            return getDataTable(list);
        }

        // 预警类型字典
        List<SysDictData> warnlist = sysDictDataService.selectDictDataByType("warning_type");
        String content10 = "",content20 = "",content30 = "",content40 = "";
        for (int i = 0; i < warnlist.size() ; i++){
            if( warnlist.get(i).getDictValue().equals("10") ){
                content10 = warnlist.get(i).getDictLabel();
            }else if( warnlist.get(i).getDictValue().equals("20") ){    // 超过xx小时无医废录入
                content20 = warnlist.get(i).getDictLabel();
            }else if( warnlist.get(i).getDictValue().equals("30") ){
                content30 = warnlist.get(i).getDictLabel();
            }else if( warnlist.get(i).getDictValue().equals("40") ){
                content40 = warnlist.get(i).getDictLabel();
            }
        }
        // 重组预警内容      warning_type  10: 超出预警值    20:超过xx小时无医废录入 30:收集医废24小时未入库    40:已入库医废超过48小时未出库
        List<YfHospitalStatus> backlist = new ArrayList<>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        for (int i = 0; i < list.size(); i++) {
            // 取预警值、暂存量
            if( list.get(i).getMaxStore() != null && list.get(i).getMaxStore() != 0 ){     // 无预警值则不需要预警
                if( list.get(i).getInStoreWeight() != null && list.get(i).getInStoreWeight() != 0 ){     // 暂存量
                    if( list.get(i).getInStoreWeight() > list.get(i).getMaxStore() ){   // 暂存量超过预警值预警
                        list.get(i).setWarningContent( content10 );
                    }
                }
            }

            // 超过24小时无医废录入 ， 如果最后一次收集时间为空 ，则取暂存点的创建时间
            // 第一种情况：从最后一次收集时间算起，超过24小时无医废录入，或暂存点未录入过医废，从暂存点创建时间算起24小时无医废录入
//            if( list.get(i).getLastCollDate() != null ){    // 最后一次收集时间
//                if( new Date().getTime() - list.get(i).getLastCollDate().getTime() > 86400000L  ){
//                    if( !StringUtils.isEmpty( list.get(i).getWarningContent() ) ){
//                        list.get(i).setWarningContent( list.get(i).getWarningContent() + " , " );
//                    }
//                    list.get(i).setWarningContent( (list.get(i).getWarningContent() == null?"":list.get(i).getWarningContent()) + content20 );
//                }
//            }else if( list.get(i).getStagingCreateTime() != null ){     // 如果没有录入过医废，取暂存点创建时间
//                if( new Date().getTime() - list.get(i).getStagingCreateTime().getTime() > 86400000L  ){
//                    if( !StringUtils.isEmpty( list.get(i).getWarningContent() ) ){
//                        list.get(i).setWarningContent( list.get(i).getWarningContent() + " , " );
//                    }
//                    list.get(i).setWarningContent( (list.get(i).getWarningContent() == null?"":list.get(i).getWarningContent()) + content20 );
//                }
//            }
            // 第二种情况：今天没有医废录入
//            if( list.get(i).getLastCollDate() != null ){    // 最后一次收集时间如果不是今天预警
//                if( !sdf.format(list.get(i).getLastCollDate()).equals(sdf.format(new Date())) ){
//                    if( !StringUtils.isEmpty( list.get(i).getWarningContent() ) ){
//                        list.get(i).setWarningContent( list.get(i).getWarningContent() + " , " );
//                    }
//                    list.get(i).setWarningContent( (list.get(i).getWarningContent() == null?"":list.get(i).getWarningContent()) + content20 );
//                }
//            }else if( list.get(i).getStagingCreateTime() != null ) {     // 如果暂存点没有创建时间不用预警，有创建时间直接预警
//                if( !StringUtils.isEmpty( list.get(i).getWarningContent() ) ){
//                    list.get(i).setWarningContent( list.get(i).getWarningContent() + " , " );
//                }
//                list.get(i).setWarningContent( (list.get(i).getWarningContent() == null?"":list.get(i).getWarningContent()) + content20 );
//            }


            // 第一种情况：从最后一次收集时间算起，超过24小时无医废录入，或暂存点未录入过医废，从暂存点创建时间算起24小时无医废录入
            if( !StringUtils.isEmpty(list.get(i).getOverdueNotinputSwitch()) && list.get(i).getOverdueNotinputHours() != null
                    && list.get(i).getOverdueNotinputSwitch().equals("0") ){   // 0 开启预警
                long overdueTime = 3600000L * (list.get(i).getOverdueNotinputHours() + 24);
                if( list.get(i).getLastCollDate() != null ){    // 有最后一次收集时间才比较，没有收集不预警
                    // 处理最后一次收集时间取到天转成long型
                    String lastCollDate = sdf.format(list.get(i).getLastCollDate());
                    if( (new Date().getTime() - sdf.parse(lastCollDate).getTime()) > overdueTime ){ // 最后一次收集时间超过设置的预警时间

                        if( list.get(i).getLastNoCollDate()== null ||
                                ( list.get(i).getLastNoCollDate()!= null
                                        && (new Date().getTime() - sdf.parse( sdf.format(list.get(i).getLastNoCollDate())).getTime()) > overdueTime ) ){  // 如果昨天报了无医废录入时间也不报警
                            if( !StringUtils.isEmpty( list.get(i).getWarningContent() ) ){
                                list.get(i).setWarningContent( list.get(i).getWarningContent() + " , " );
                            }
                            list.get(i).setWarningContent( (list.get(i).getWarningContent() == null?"":list.get(i).getWarningContent()) +
                                    content20.replace("xx",list.get(i).getOverdueNotinputHours() + "" ) );
                        }
                    }
                }else if( list.get(i).getStagingCreateTime() != null ){     // 如果没有录入过医废，取暂存点创建时间
                    // 处理最后一次收集时间取到天转成long型
                    String stagingCreateTime = sdf.format(list.get(i).getStagingCreateTime());
                    if( (new Date().getTime() - sdf.parse(stagingCreateTime).getTime()) > overdueTime ){
                        if( list.get(i).getLastNoCollDate()== null ||
                                ( list.get(i).getLastNoCollDate()!= null
                                        && (new Date().getTime() - sdf.parse( sdf.format(list.get(i).getLastNoCollDate())).getTime()) > overdueTime ) ){  // 如果昨天报了无医废录入时间也不报警
                            if( !StringUtils.isEmpty( list.get(i).getWarningContent() ) ){
                                list.get(i).setWarningContent( list.get(i).getWarningContent() + " , " );
                            }
                            list.get(i).setWarningContent( (list.get(i).getWarningContent() == null?"":list.get(i).getWarningContent()) +
                                    content20.replace("xx",list.get(i).getOverdueNotinputHours() + "" ) );
                        }
                    }
                }

            }


            // 第三种情况：未开启超期未录入的不预警；
            // 开启的，从最后一次收集时间取到天算起，超过设置的超期未录入预警小时加24的报异常；暂存点未录入过医废不进行超期未录入预警
//            if( !StringUtils.isEmpty(list.get(i).getOverdueNotinputSwitch()) && list.get(i).getOverdueNotinputHours() != null
//                    && list.get(i).getOverdueNotinputSwitch().equals("0") ){   // 0 开启预警
//                if( list.get(i).getLastCollDate() != null ){    // 有最后一次收集时间才比较，没有收集不预警
//                    // 处理最后一次收集时间取到天转成long型
//                    String lastCollDate = sdf.format(list.get(i).getLastCollDate());
//                    if( (new Date().getTime() - sdf.parse(lastCollDate).getTime()) > (3600000L * ( list.get(i).getOverdueNotinputHours() + 24 )) ){
//                        if( !StringUtils.isEmpty( list.get(i).getWarningContent() ) ){
//                            list.get(i).setWarningContent( list.get(i).getWarningContent() + " , " );
//                        }
//                        list.get(i).setWarningContent( (list.get(i).getWarningContent() == null?"":list.get(i).getWarningContent()) +
//                                content20.replace("xx",list.get(i).getOverdueNotinputHours() + "" ) );
//                    }
//                }
//            }

            // 收集医废24小时未入库
            if( list.get(i).getNoInCodeIdCount() != null && list.get(i).getNoInCodeIdCount()> 0
                    && list.get(i).getNoInBag() != null && list.get(i).getNoInBag()> 0 ){
                if( !StringUtils.isEmpty( list.get(i).getWarningContent() ) ){
                    list.get(i).setWarningContent( list.get(i).getWarningContent() + " , " );
                }
                list.get(i).setWarningContent( (list.get(i).getWarningContent() == null?"":list.get(i).getWarningContent()) + content30 );
            }
            // 已入库医废超过48小时未出库
            if( list.get(i).getNoOutCodeIdCount() != null && list.get(i).getNoOutCodeIdCount()> 0
                    && list.get(i).getNoOutBag() != null && list.get(i).getNoOutBag()> 0 ){
                if( !StringUtils.isEmpty( list.get(i).getWarningContent() ) ){
                    list.get(i).setWarningContent( list.get(i).getWarningContent() + " , " );
                }
                list.get(i).setWarningContent( (list.get(i).getWarningContent() == null?"":list.get(i).getWarningContent()) + content40 );
            }
            // 暂存点是否需要预警
            if( !StringUtils.isEmpty( list.get(i).getWarningContent() ) ){
                backlist.add( list.get(i) );
            }
        }

        // 修改之前 -- 直接返回 backlist ， 显示全部的异常暂存点，起不到分页作用
        // return getDataTable(backlist);


        // 修改后 -- backlist 分段取出   第一次 默认   页数： 1      每页条数：10
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();

        // System.out.println( "  ----------------------- 页数：" + pageNum + "    每页条数：" +  pageSize  );


        // 最终返回的分页的list
        List<YfHospitalStatus> zlist;

        int startIndex = (pageNum - 1) * pageSize;
        int endIndex = startIndex + pageSize;
        // 如果起始位超过 backlist 的长度，返回空list
        if( startIndex > (backlist.size() - 1) ){
            zlist = new ArrayList<>();
        }else{
            zlist = backlist.subList(startIndex,endIndex > backlist.size()? backlist.size():endIndex );
        }


        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(0);
        rspData.setRows(zlist);
        rspData.setTotal(new PageInfo(backlist).getTotal());

        return rspData;

    }


    /**
     * 导出院内医废预警量配置列表
     * d7577597-4035-40ee-b5a0-7d112b2f7e1e
     */
    @RequiresPermissions("yf:warning:export")
    @Log(title = "院内医废预警量配置", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    @ResponseBody
    public AjaxResult export(YfStorageWarning yfStorageWarning)
    {
        List<YfStorageWarning> list = yfStorageWarningService.selectYfStorageWarningList(yfStorageWarning);
        ExcelUtil<YfStorageWarning> util = new ExcelUtil<YfStorageWarning>(YfStorageWarning.class);
        return util.exportExcel(list, "warning");
    }


    /**
     * 新增保存院内医废预警量配置
     * ff832788-178f-4565-aa0f-ee53d18d4186
     */
    @RequiresPermissions("yf:warning:add")
    @Log(title = "院内医废预警量配置", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(YfStorageWarning yfStorageWarning)
    {
        return toAjax(yfStorageWarningService.insertYfStorageWarning(yfStorageWarning));
    }


    /**
     * 修改院内医废预警量配置
     * 3455ce59-4f94-47eb-81e4-b195520f64c9
     */
    @GetMapping("/edit/{id}")
    public String edit(@PathVariable("id") Long id, ModelMap mmap)
    {
        YfStorageWarning yfStorageWarning = yfStorageWarningService.selectYfStorageWarningById(id);
        mmap.put("yfStorageWarning", yfStorageWarning);
        return prefix + "/edit";
    }


    /**
     * 修改保存院内医废预警量配置
     * ff3f6ce9-ec4b-4095-8ad0-7ce1fe35cde7
     */
    @RequiresPermissions("yf:warning:edit")
    @Log(title = "院内医废预警量配置", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    @ResponseBody
    public AjaxResult editSave(YfStorageWarning yfStorageWarning)
    {
        return toAjax(yfStorageWarningService.updateYfStorageWarning(yfStorageWarning));
    }


    /**
     * 删除院内医废预警量配置
     * d4ce4bd9-37ca-4303-ae05-1fc1c54ddb8e
     */
    @RequiresPermissions("yf:warning:remove")
    @Log(title = "院内医废预警量配置", businessType = BusinessType.DELETE)
    @PostMapping( "/remove")
    @ResponseBody
    public AjaxResult remove(String ids)
    {
        return toAjax(yfStorageWarningService.deleteYfStorageWarningByIds(ids));
    }


    /**
     * 保存院内医废预警量配置
     * 0c3bc346-61b9-416a-88fa-186d39924f0b
     */
    @RequiresPermissions("yf:warning:add")
    @Log(title = "院内医废预警量配置", businessType = BusinessType.INSERT)
    @PostMapping("/saveYfTypeWarn")
    @Transactional
    @ResponseBody
    public int saveYfTypeWarn(@RequestBody List<YfStorageWarning> list) {
//        for (int i = 0; i < list.size() ; i++) {
//            System.out.println("    " + i +" id:  " + list.get(i).getId() + "   " + list.get(i).getHospitalId()
//                    + "   " + list.get(i).getYfTypeValue() + "   " + list.get(i).getMaxStore() );
//
//        }
        try{
            for (int i = 0; i < list.size() ; i++) {
                if( list.get(i).getId() == null ){      // 添加
                    if( list.get(i).getMaxStore() != null && list.get(i).getMaxStore() != 0 ){   // 预警值不是0 才添加
                        list.get(i).setCreateId( ShiroUtils.getUserId() );
                        list.get(i).setCreateTime( new Date());
                        yfStorageWarningService.insertYfStorageWarning( list.get(i) );
                    }
                }else{  // 更新
                    if( list.get(i).getMaxStore() == null || list.get(i).getMaxStore() == 0 ){
                        list.get(i).setMaxStore(null);
                    }
                    list.get(i).setUpdateId( ShiroUtils.getUserId() );
                    list.get(i).setUpdateTime( new Date());
                    yfStorageWarningService.updateYfStorageWarning( list.get(i) );
                }
            }
            return 1;   // 1 成功
        }catch (Exception e){
            e.printStackTrace();
            return 0;   // 0 失败
        }
    }


}
